package com.example.basicquestions.questions.关联端口合并;

/**
 * @author liw
 * @date 2023-03-11
 */

import java.util.*;

/**
 * 关联端口组合并
 * 时间限制：1s空间限制：256MB 限定语言：不限
 * 题目描述：
 * 有M (1<=M<=10） 个端口组，每个端口组是长度为N(1<=N<=100)的整数数组，如果端口组问存在2个及以上不同端
 * 口相同，则认为这两个端口组互相关联，可以合井。
 * 第一行输入端口组个数M，再输入M行，每行逗号分隔，代表端口组，输出合井后的端口组用二维数组表示
 *
 * 输入描述：
 * 端口组内数字可以重复
 * 输出描述：
 * 1组内相同端口仅保留一个，从小到大排序。
 * 2.组外顺序保持输入顺序
 * 补充说明：
 * M，N不再限定范国内，统一输出一组空数组ID
 */

import java.util.*;

public class Main{
    public static int max=0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int M=sc.nextInt();
        if(M>10){   //大于10时直接输出
            System.out.println("[[]]");
        }else{
            List<Set<Integer>> list=new ArrayList<>();
            sc.nextLine();
            for(int i=0;i<M;i++){   //依次加入list并判断是否可以合并
                Set<Integer> set=new TreeSet<>();
                String[] strings=sc.nextLine().split(",");
                int[] ints=Arrays.stream(strings).mapToInt(Integer::parseInt).toArray();
                if(strings.length==1){
                    set.add(ints[0]);
                    list.add(set);
                }else{
                    for(int j:ints){
                        set.add(j);
                    }
                    // System.out.println(set);
                    list.add(set);  //加入当前set
                    // System.out.println(list);
                    merge(set,list,list.size()-1);
                }
            }
            System.out.println(list);
        }
    }

    public static void merge(Set<Integer> set,List<Set<Integer>> list,int index){
        for(int i=0;i<list.size();i++){
            if(i==index){	//此处表示自己不要和自己做比较，index指代当前set在list中的索引
                continue;
            }
            Set<Integer> setIndex=list.get(i);
            Set<Integer> setTemp=new TreeSet<>(set);    //TreeSet自然排序
            setTemp.retainAll(setIndex);
            if(setTemp.size()>=2){	//交集大于2时合并
                set.addAll(setIndex);
                int max=Math.max(i,index);
                int min=Math.min(i,index);
                list.remove(max);
                list.set(min,set);
                merge(set,list,min);
            }
        }
    }
}

